//
// Created by PC on 2023/3/1.
// 整数拼接 程序(2020年试题I)
// https://mp.weixin.qq.com/s/m0LcfeTaDK6qTPzSgoIkVA
//【问题描述】
//给定一个长度为n的数组A1,A2,A3....,An。你可以从中选出两个数Ai和Aj(i≠j)，然后将Ai和Aj一前一后拼成一个新的整数。 例如:12和345可以拼成12345或34512。
//注意:
//交换Ai和Aj的顺序总是被视为两种拼法。即便Ai=Aj请你计算有多少种拼法满足拼出的整数是k的倍数。
//[输入格式]
//第一行包含两个整数n和k。
//第二行包含n个整数A1,A2,……,An。
/*[输出格式]
一个整数，代表答案。
[样例输入1]
4 2
1 2 3 4
[样例输出1]
6
[样例输入2]
5 2
1  12  123  1234  12345
[样例输出2]
8
 */
//

#include <iostream>
#include <cmath>
#include "../arrUtil.h"
using namespace std;

// 判断给定的整数是几位数
int digit(int num)
{
    int i = 1;
//    int p = pow(10,i);
    if (num/pow(10,i)==1)
        return 2;
    while (num/pow(10,i)>1)
    {
        ++i;
    }
//    printf("num has %d digits.",i);
    return i;
}

int intPow(int a,int b)
{
    int ret=1;
    for (int i = 0; i < b; ++i)
    {
        ret*=a;
    }
    return ret;
}

int joint(int *arr, int n, int k)
{
    int count=0;
    for (int i = 0; i < n; ++i)
    {
        for (int j = 0; j < n; ++j)
        {
            if (i==j) continue;
//            printf("%d & %d\n", arr[i],arr[j]);
//            int ret = arr[i]*pow(10,digit(arr[j]))+arr[j];
            int a = arr[i];
            int b = arr[j];
            int p = intPow(10,digit(arr[j]));
//            int p = (int)pow(10,digit(arr[j])); //用pow函数结果会出错 原因未知
            int ret = a*p+b;
            if (ret%k==0)
            {
                printf("%d ", ret);
                ++count;
            }

        }
    }
//    printArr(arr,n);
    return count;
}

int main()
{
    int count;
    int kk;
    scanf("%d %d", &count,&kk);
    int nums[count];
    for (int i = 0; i < count; ++i)
    {
        scanf("%d",&nums[i]);
    }
    printf("\n%d\n",joint(nums,count,kk));
//    printf("%d",digit(101));
//    printf("%d",(int)pow(10,3));
    return 0;
}



